﻿#pragma once
#include "链表.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

链表_结构* 构造_链表()
{
    链表_结构 *表 = malloc(sizeof(链表_结构));
    表->第一个节点 = NULL;
    表->最后一个节点 = NULL;
    return 表;
}

void 销毁_链表(链表_结构 *表)
{
    清空链表(表);
    free(表);
}

链表节点_结构* 添加链表数据(链表_结构 *表,const int 数据)
{
    链表节点_结构 *点 = malloc(sizeof(链表节点_结构));
    点->数据 = 数据;
    点->后继 = NULL;
    
    if(表->第一个节点 == NULL)
    {
        表->第一个节点 = 点;
        表->最后一个节点 = 点;
    }
    else
    {
        表->最后一个节点->后继 = 点;
        表->最后一个节点 = 表->最后一个节点->后继;
    }
    return 点;
}

void 删除链表节点(链表_结构 *表, 链表节点_结构* 点)
{
    if(表->第一个节点 == NULL)
    {
        return;
    }
    链表节点_结构 *前一个节点 = 表->第一个节点;
    链表节点_结构 *当前节点 = 表->第一个节点->后继;

    //处理第一个节点
    if(表->第一个节点 == 点)
    {
        当前节点 = 表->第一个节点;
        表->第一个节点 = 表->第一个节点->后继;
        goto 释放;
    }
    //从第二个节点开始处理
    while (当前节点 != NULL)
    {
        if(当前节点 == 点)
        {
            释放:{
                前一个节点->后继 = 当前节点->后继;
                free(当前节点);
                return;
            }
        }
        前一个节点 = 前一个节点->后继;
        当前节点 = 当前节点->后继;
    }
}

void 删除链表数据(链表_结构 *表, const int 数据)
{
    if(表->第一个节点 == NULL)
    {
        return;
    }
    链表节点_结构 *前一个节点 = 表->第一个节点;
    链表节点_结构 *当前节点 = 表->第一个节点->后继;

    //处理第一个节点
    if(表->第一个节点->数据 == 数据)
    {
        当前节点 = 表->第一个节点;
        表->第一个节点 = 表->第一个节点->后继;
        goto 释放;
    }
    //从第二个节点开始处理
    while (当前节点 != NULL)
    {
        if(当前节点->数据 == 数据)
        {
            释放:{
                前一个节点->后继 = 当前节点->后继;
                free(当前节点);
                return;
            }
        }
        前一个节点 = 前一个节点->后继;
        当前节点 = 当前节点->后继;
    }
}

void 清空链表(链表_结构 *表)
{
    链表节点_结构 *遍历节点 = 表->第一个节点;
    while (遍历节点 != NULL)
    {
        链表节点_结构 *临时节点 = 遍历节点->后继;
        free(遍历节点);
        遍历节点 = 临时节点;
    }
    表->第一个节点 = NULL;
    表->最后一个节点 = NULL;
}

链表节点_结构* 查询链表节点(const 链表_结构 *表,const int 数据)
{
    链表节点_结构 *临时节点 = 表->第一个节点;
    while (临时节点 != NULL)
    {
        if(临时节点->数据 == 数据)
        {
            return 临时节点;
        }
        临时节点 = 临时节点->后继;
    }
    return NULL;
}

bool 链表空了(const 链表_结构 *表)
{
    return 表->第一个节点 == NULL;
}

void 遍历所有链表节点(const 链表_结构 *表)
{
    const 链表节点_结构 *临时节点 = 表->第一个节点;
    const char 后缀串[] = "->";
    char 结果串[1024] = "";
    while (临时节点 != NULL)
    {
        char 数据串[10] = "";
        _itoa_s(临时节点->数据,数据串,10,10);
        
        拼接两个字符串(数据串,后缀串);

        拼接两个字符串(结果串, 数据串);
        临时节点 = 临时节点->后继;
    }
    拼接两个字符串(结果串, "NULL");
    printf_s("%s\n",结果串);
}
